package br.edu.fasete.javaroad.base;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.jdt.core.IJavaProject;

import br.edu.fasete.javaroad.log.LogManager;
import br.edu.fasete.javaroad.model.ClassAssociationDescriptor;
import br.edu.fasete.javaroad.model.EntityDescriptor;
import br.edu.fasete.javaroad.model.architeture.Component;
import br.edu.fasete.javaroad.plugin.ProjectConfigurations;


public class JavaRoad {
	private GenericFileGenerator generator;
	ProjectConfigurations configuration;
	private static IJavaProject project;
	
	
	
	public static IJavaProject getProject() {
		return project;
	}

	public static void setProject(IJavaProject project) {
		JavaRoad.project = project;
	}
	
	

	public void setFileList(List<String> files) {
		generator.setArquivos(files);
	}

	public JavaRoad(ProjectConfigurations configuration) {
		this.configuration = configuration; 
		this.generator = new GenericFileGenerator(configuration.getPacote(),
				configuration.getListaClasses(),
				new ArrayList<String>(),
				configuration.getArchiteture().getVariables());
	}

	public void criarProjeto(List<String> componentes) {
		reorganizarAssociacoes();
		LogManager.getLogger().appendMessage("Início da Criação do Projeto----------");
		for(Component c: configuration.getArchiteture().getComponents()) {
			if(componentes.contains(c.getName())) {
			String dir = createFullDirectoryName(c);
			LogManager.getLogger().appendMessage("++++++++Geração do " + c.getName());
			LogManager.getLogger().appendMessage("++++++++Diretório: " + dir);
			generator.criarDiretorio(dir);
			generator.setComponent(c, dir);
			generator.generate();
			}
		}
		LogManager.getLogger().appendMessage("=======================>FIM");
	}
	
	public List<String> criarListaArquivos(List<String> componentes) {
		List<String> arquivos = new ArrayList<String>();
		for(Component c: configuration.getArchiteture().getComponents()) {
			if(componentes.contains(c.getName())) {
				String dir = createFullDirectoryName(c);
				generator.setComponent(c, dir);
				generator.generateFileList(arquivos);
			}
		}
		return arquivos;
	}
	
	
	private String createFullDirectoryName(Component component) {
		String dir;
		if(component.isDirectoryAbsolute()) {
			dir = configuration.getProjectPath();
		} else {
			dir = configuration.getProjectPath() + "/" + configuration.getProjectRoot();
			if(!dir.endsWith("/"))
				dir+="/";
			dir+=pacoteParaDiretorio(configuration.getPacote());
		}
		if(!dir.endsWith("/"))
			dir+="/";
		dir+= pacoteParaDiretorio(component.getDirectory());
		return dir;		
	}
	
	private String pacoteParaDiretorio(String pacote) {
		String diretorio = pacote.replace(".", "/");
		return diretorio;
	}

	private void reorganizarAssociacoes() {
		for(EntityDescriptor classe : configuration.getListaClasses().getClasses()) {
			for(ClassAssociationDescriptor associacao : classe.getAssociationsOneToMany()) {
				if(associacao.isManytomany()) {
					classe.getAssociationsOneToMany().remove(associacao);
					classe.getAssociationsManyToMany().add(associacao);
				}
			}
		}
	}

	public String getDiretorioProjeto(boolean root) {
		if(root)
			return configuration.getProjectRoot();
		else
			return configuration.getProjectPath();
	}


}
